/**
 * 防抖
 * n 秒内函数只会执行一次，如果 n 秒内高频事件再次被触发，则重新计算时间
 * 每次触发事件时都取消之前的延时调用方法： eg1:比如生活中的坐公交，就是一定时间内，如果有人陆续刷卡上车，司机就不会开车。只有别人没刷卡了，司机才开车。
 * eg2:/函数防抖：如果有人进电梯（触发事件），那电梯将在10秒钟后出发（执行事件监听器），这时如果又有人进电梯了（在10秒内再次触发该事件），我们又得等10秒再出发（重新计时）。
 */
function debounce(fn, delay = 1000) {
  let timer
  return function () {
    const args = arguments
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      fn.apply(this, args) //改变this指向为调用debounce所指的对象
    }, delay);
  }
}



window.addEventListener('scroll', debounce(() => { console.log("执行事情"); }, 2000))

/**
 * 节流
 * 在 n 秒内只会执行一次，所以节流会稀释函数的执行频率。
 * eg1: 保证如果电梯第一个人进来后，10秒后准时运送一次，这个时间从第一个人上电梯开始计时，不等待，如果没有人，则不运行。
 */

function throttle(fn, delay) {
  let flag = true;
  return function () {
    if (!flag) return
    flag = false
    const args = arguments
    setTimeout(() => {
      fn.apply(this, args)
      flag = true
    }, delay);
  }
}


function debounce(fn, wait) {
  let timer
  return function (params) {
    if (timer) clearTimeout(timer)
    const args = arguments
    timer = setTimeout(() => {
      fn.apply(this, args)
    }, wait);
  }
}